/**
 * Project 68th
 */


#ifndef _THREADPOOL_H
#define _THREADPOOL_H

#include "TaskQueue.h"
#include <unistd.h>
#include <vector>
#include <thread>
using std::vector;
using std::thread;


class ThreadPool {
public: 

    /**
     * @param threadNum
     * @param queSize
     */
    ThreadPool(size_t threadNum, size_t queSize);
    ~ThreadPool();

    //线程池启动与关闭
    void start();
    void stop();

    /**
     * @param ptask
     */

    //生产者线程添加任务
    void addTask(ElemType && ptask);

private:
    //消费者线程（工作线程）从任务队列中获取任务
    ElemType getTask();

    //注册给工作线程作为入口函数
    void doTask();
private: 
    size_t _threadNum; //工作线程的数量
    vector<thread> _threads; //存放thread的容器
    size_t _queSize; //任务队列的容量上限
    TaskQueue _taskQue; //任务队列
    bool _isExit; //标志着线程池是否退出

};

#endif //_THREADPOOL_H
